Lesson 8

2020.4 edit by David Yi

本课内容要点

  • 函数介绍和用法
  • 思考:剪刀石头布

函数用法

函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。

python 提供了许多内建函数,比如 print(), max();

python 提供的大量内建函数,可以满足绝大多数基本的功能,有时候 python 语言是瑞士军刀,就是这个意思。

函数可以大大简化重复代码,降低工作量,减少错误。

函数的基本语法

def 函数名称( 参数 ): 
    函数语句 
    return [值]

虽然 Python 内置了大量函数,但是大多数提供的是基本功能,有时候还是不能满足真正程序的需要; 函数可以做的很复杂,发展为包(Package)。Python 目前有七万多个各类功能的包,几乎都可以可以免费使用在自己的程序中,这是最近几年 Python 飞速发展的原因之一。 学会使用函数来简化程序之后,可以为以后学习面向对象的编程方法打好基础,也可以真正的开始使用 Python 来解决各类问题。

2017年编写这个文档的时候,python 有大约7万多个包,现在,2020年4月,我看了一下 pypi,python 包的大本营,目前有 23万个包了。


In [4]:
# 计算圆的面积
# 不用函数的话,每次需要写一些重复的代码

r1 = 4
r2 = 6
r3 = 5.61
s1 = 3.14 * r1 * r1
s2 = 3.14 * r2 * r2
s3 = 3.14 * r3 * r3

print(s1)
print(s2)
print(s3)


50.24
113.03999999999999
98.82239400000002

In [5]:
# 定义一个函数,用来计算圆面积
# 输入 半径,返回 圆面积

def func1(r):
    s = 3.14 * r * r
    return s

print(func1(4))
print(func1(6))
print(func1(5.61))


50.24
113.03999999999999
98.82239400000002

In [8]:
# 先来看看 python 内置的获取最大值的函数

print(max(1,5))

print(max(1,4,6,3,9))


5
9

In [1]:
# 请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。
# 因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
# 从优雅的写法来说,不是很推荐一个函数内有多个返回点的方式,但是有时候这样写的确很方便

def my_max(a,b):
    if a > b:
        return a
    else:
        return b
    
print(my_max(3,6))


6

如果上面的函数要修改只有一个 return 应该怎么修改呢?


In [2]:
# *number 这样的写法,可以理解为传入任意数目个参数,包括0个参数,就是在参数名称前面加上一个 * 
# 为了简化程序逻辑,返回的结果现在是假的

def my_max(*number):
    print(number)
    return 100

print(my_max(1,5,30,14,25))


(1, 5, 30, 14, 25)
100

In [3]:
# 用列表来排序,来完成这个取得任意值的最大值的函数

def my_max(*number):
    a_list = list(number)
    a_list.sort()
    a = a_list[-1]
    return a

print(my_max(1,5,30,14,25))


30

In [2]:
# Python的函数返回多值其实就是返回一个tuple,但语法上可以省略括号,写起来更方便

# 同时返回最大值和最小值

def my_max_min(*number):
    a_list = list(number)
    a_list.sort()
    my_max = a_list[-1]
    my_min = a_list[0]
    return my_max, my_min

print(my_max_min(1,5,30,14,25))


(30, 1)
  • 写一个函数,输入一个数字,判断其是否是偶数,是偶数的话,返回 True,反之返回 False
  • 写一个函数,输入一个英文单词,返回其中的元音字母的个数

In [4]:
# 判断奇偶数

a = int(input('Input a number:'))

def oushu():
    if int(a/2) == a/2:
        return True
        #print('这是个偶数')
    else:
        return False
        #print('这是个奇数')
        
result = oushu()   
print(result)


Input a number:4
True

In [1]:
# 判断元音

def yuanyin(s):
    b = ['a','e','i','o','u']
    c = 0
    for i in list(a):
        if i in b:
            # c=c+1 的简约写法
            c += 1
    return c

a = input('plese input a word:')
print(yuanyin(a))


plese input a word:test
1

In [5]:
# 找到最大数 #1

def find_max(list1):
    
    # max = float('-inf') 表示负无穷大
    max = float('-inf')
    for x in list1:
        if x > max:
            max = x
    return max

print(find_max([-20,1,6,7,20,5]))
print(find_max([-20,-3,-6,-7,-5]))


20
-3

In [6]:
# 找到最大数 #2
# 使用递归,递归是编程中非常有效的一种解决问题的方式,将内在逻辑分解为一个固定的逻辑,而调用参数来自于上一次的执行结果
# 使用递归要注意初始化和防止递归陷入死循环
# 排序、斐波那契数列这些都是递归的经典实现

def find_max(list1):
    if len(list1) == 1:
        return list1[0]
    v1 = list1[0]
    v2 = find_max(list1[1:])
    if v1 > v2:
        return v1
    else:
        return v2

print(find_max([1,6,7,20,5]))


20

思考

  1. 剪刀石头布。

In [ ]:
# 简单的剪刀石头布

import random

FIRST = 0
SECOND = 1 
BOTH = 2 

t1 = ('剪刀', '石头', '布')
t2 = ('human win', 'computer win', 'draw')

def which_win(i1, i2):
    if i1 == 0 and i2 == 1:
        return SECOND
    if i1 == 0 and i2 == 2:
        return FIRST
    if i1 == 1 and i2 == 0:
        return FIRST
    if i1 == 1 and i2 == 2:
        return SECOND
    if i1 == 2 and i2 == 0:
        return SECOND
    if i1 == 2 and i2 == 1:
        return FIRST
    if i1 == i2:
        return BOTH

print('0:剪刀 1:石头 2:布')
human = int(input('你出了:'))

c_index = random.randint(0,2)
computer = t1[c_index]

print("电脑出了",computer)

print(t2[which_win(human, c_index)])

In [ ]:
# 优化的剪刀石头布程序

import random

FIRST = 0
SECOND = 1 
BOTH = 2 

t1 = ('scissors', 'stone', 'cloth')
t2 = ('human win', 'computer win', 'draw')

table = {'01':1, '02':0, '10':0, '12':1, '20':1, '21':0, '00':2, '11':2, '22':2}

def which_win(i1, i2):
    s = i1 + i2
    return table.get(s)

# 显示规则
for i, s in enumerate(t1):
    print(i, s, ', ', end='')
    
human = input('please input:')
h_index = int(human)
human_choice = t1[h_index]

c_index = random.randint(0,2)
computer_choice = t1[c_index]

print('human:',h_index,human_choice)
print('computer:',c_index, computer_choice)
print(t2[which_win(str(h_index), str(c_index))])

In [ ]:
# 五局三胜的剪刀石头布程序

import random

FIRST = 0
SECOND = 1 
BOTH = 2 

t1 = ('scissors', 'stone', 'cloth')
t2 = ('human win', 'computer win', 'draw')

table = {'01':1, '02':2, '10':0, '12':1, '20':1, '21':0, '00':2, '11':2, '22':2}

def which_win(i1, i2):
    s = i1 + i2
    return table.get(s)

mark = True
computer_win = 0
human_win = 0

while mark:

    # 显示规则
    for i, s in enumerate(t1):
        print(i, s, ', ', end='')
        
    human = input('please input:')

    c_index = random.randint(0,2)
    computer = t1[c_index]

    print(c_index, computer)

    who_win = which_win(human, str(c_index))
    
    if who_win == 0:
        human_win += 1
    if who_win == 1:
        computer_win += 1
    
    print(t2[which_win(human, str(c_index))])
    print('human:computer ', human_win, ':', computer_win)
    print()
    
    if (human_win == 3) or (computer_win == 3):
        mark = False

if human_win == 3:
    print('final human win')
else:
    print('final computer win')
  1. 写一个电脑来猜数的程序

In [ ]:
# 猜数,机器猜

min = 0
max = 1000

guess_ok_mark = False

while not guess_ok_mark:

    cur_guess = int((min + max) / 2)
    print('I guess:', cur_guess)
    human_answer = input('Please tell me big or small:')
    if human_answer == 'big':
        max = cur_guess
    if human_answer == 'small':
        min = cur_guess
    if human_answer == 'ok':
        print('HAHAHA')
        guess_ok_mark = True

In [ ]: